Skip to main content

팩토리 메소드 패턴

팩토리 메소드 패턴이란?

  • 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 하는 패턴

    즉, 객체를 만들어 내는 공장(Factory 객체)을 만드는 패턴이다.

위 설명을 좀 더 쉽게 설명하자면,

예를 들어 카드를 생성한다고 했을 때 단순히 카드를 생성하겠다는 것은 기반 클래스에서 정의를 하고, 구체적으로 어떤 카드를 생성할 지는 서브 클래스가 결정하는 것이다.

팩토리 메소드의 구조

structure

  • Creator의 서브 클래스에 팩토리 메소드를 정의하여, 팩토리 메소드 호출로 적절한 ConcreteProduct 인스턴스를 반환한다.

팩토리 메소드 패턴의 예시 (Java 코드)

  • Product 인터페이스
abstract class Product {
public abstract void use();
}
class IDCard extends Product {
private String owner;

public IDCard(String owner) {
System.out.println(owner + " 카드 생성");
this.owner = owner;
}

@Override
public void use() {
System.out.println(owner + " 카드 사용");
}

public String getOwner() {
return owner;
}
}
  • 객체를 만드는 Factory
abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product p);
}
class IDCardFactory extends Factory {
private List<String> owners = new ArrayList<>();

@Override
protected Product createProduct(String owner) {
return new IDCard(owner);
}

@Override
protected void registerProduct(Product p) {
owners.add(((IDCard) p).getOwner());
}

public List<String> getOwners() {
return owners;
}
}
  • 사용
Factory factory = new IDCardFactory();
Product card1 = factory.create("홍길동");
Product card2 = factory.create("이순신");
Product card3 = factory.create("강감찬");
card1.use();
card2.use();
card3.use();
  • 실행 결과
홍길동의 카드를 만듭니다.
이순신의 카드를 만듭니다.
강감찬의 카드를 만듭니다.
홍길동의 카드를 사용합니다.
이순신의 카드를 사용합니다.
강감찬의 카드를 사용합니다.

팩토리 메소드를 사용하는 이유

팩토리 메소드 패턴을 사용하면 클래스 간의 결합도를 낮출 수 있다. 결합도는 클래스의 변경점이 발생하였을 때, 이 변경점이 다른 클래스들에 얼마나 많은 영향을 주느냐를 나타내는 정도를 말하는데 팩토리 메소드를 사용하게 되면 객채 생성을 서브클래스에 위임함으로써, 직접 객체를 생성해 사용하는 것을 방지할 수 있기 때문에 보다 효율적인 코드 제어가 가능하며 의존성을 제거할 수 있다.

그래서 결과적으로 결합도를 낮출 수 있게 된다.

팩토리 메소드의 장단점

  • 장점
    • 생성자가 아닌 메소드로 작동하기 때문에 리턴값을 가지게 되므로 상황에 따라 서로 다른 객체를 반환할 수 있다
    • 객체들을 한 곳에서 관리할 수 있다
    • 코드의 중복을 줄일 수 있다
    • 유연하고 확장성 있는 구조를 가진다.
    • 이름을 가질 수 있다. ( 목적을 확실히 나타낼 수 있다. )
  • 단점
    • 계속해서 새로운 하위클래스를 정의한다는 점 때문에 불필요하게 많은 클래스를 정의할 경우가 생긴다. 이로 인해, 복잡해 질 수 있다는 단점이 존재한다.

면접에 나올 수 있는 질문

  • 팩토리 메소드가 무엇인지에 대해 말해보세요
  • 팩토리 메소드와 생성자의 차이점을 말해보세요
  • 결합도가 낮아지면 좋은이유에 대해 말해보세요
  • 다음과 같은 객체가 주어졌을 때 팩토리 메소드를 작성해보세요 ( 위의 Card와 Product가 주어졌다고 가정 )

참고자료

기여자


HongEunho

📦